# -*- coding: utf-8 -*-
from django import forms
from django.contrib.auth.models import User
from bd42.apps.bdig.models import *
from bd42.utils import widgets
from datetime import date

### Requisitos ###
## ToDo ##


## Done ##
# o sistema deve ter um formulário para o colaborador passar o trabalho para outro colaborador
# o sistema deve ter um formulário para que o 'usuário' altere as suas informações pesoais
# o sistema deve ter um formulário para de correção para o colaborador e o publicador
# o sistema deve ter um formulário para o autor enviar a correção do trabalho
# o sistema também deve ter um formulário para o autor fazer o cadastro dos co-autores
# o sistema deve ter um formulário para o autor alterar as informações do trabalho
# o sistema deve ter uma lista com o trabalhos pendentes para cada tipo de 'usuário'
# no formulario de cadastro de trabalho o usuário não pode cadastrar um trabalho colocando ele como autor
# no formulario de cadastro de trabalho não pode ter super usuário como autor


class FormularioLogin(forms.Form):
    """
    Classe reponsável pelo formulário de Login
    Sendo usado por todos os usuários exceto os Administradores do Sistema
    """
    username = forms.CharField(label='Usuário',)
    password = forms.CharField(label='Senha', widget=forms.PasswordInput)


class FormularioUsuario(forms.Form):
    """
    Classe reponsável pelo formulário de Cadastro de Usuário e
    Edição de Perfil de Usuário
    Sendo usado pelo usuário colaborador para cadastro de usuário (autor)
    e também por todos os outros usuários para Edição de Perfil
    """

    username = forms.CharField(label='Usuário',)
    password = forms.CharField(label='Senha', widget=forms.PasswordInput)
    first_name = forms.CharField(label='Primeiro Nome',)
    last_name = forms.CharField(label='Sobrenome',)
    email = forms.EmailField(label='E-mail',)
    dataNascimento = forms.DateField(
        label='Data de Nascimento',
        help_text="Inserir data no formato dd/mm/aaaa.",
        widget=widgets.DateWidget,
        input_formats = ("%d/%m/%Y",),
    )
    endereco = forms.CharField(label='Endereço', widget=forms.Textarea)
    cidade = forms.ChoiceField(choices = [[x[0], x[1] + ' - ' + x[2]] for x in Cidade.objects.values_list()],)
    titulacao = forms.ChoiceField(label='Titulação', choices = Titulacao.objects.values_list(),)
    lattes = forms.URLField(initial='http://',)
    
    def clean_username(self):
        # validação de duplicidade de username
        if User.objects.filter(username = self.data['username']):
            raise forms.ValidationError('Um usuário com este username já existe, informe outro username.')
        else:
            return self.data['username']
    
    def clean_dataNascimento(self):
        # validação proibindo usuario menos de 16 anos
        t = date.today()
        dn = self.data['dataNascimento'].split('/')
        dn = date(int(dn[2]), int(dn[1]), int(dn[0]))
        if dn > date(t.year - 16, t.month, t.day):
            raise forms.ValidationError('O usuário deve ter idade minima de 16 anos.')
        else:
            return self.data['dataNascimento']


class FormularioCadastroTrabalho(forms.Form):
    """
    Classe responsável pelo formulário de Cadastro de Trabalho
    Sendo usado pelo usuário colaborador
    """
    programa = forms.ChoiceField(choices= [[x[0], x[1]] for x in Programa.objects.values_list()])
    titulo = forms.CharField(label = 'Título',)
    autor= forms.ChoiceField(choices = [[x[0], x[2]+" "+x[3]] for x in User.objects.exclude(is_superuser=True).values_list()])


class FormularioAutorCorrecaoTrabalho(forms.Form):
    """
    Classe responsável pelo formulário do Autor de Correcao de Trabalho
    """

    id = forms.IntegerField(widget=forms.HiddenInput)
    titulo = forms.CharField(label = 'Título',)
    resumo = forms.CharField(widget=forms.Textarea)
    title = forms.CharField()
    abstract = forms.CharField(widget=forms.Textarea)
    palavrasChave = forms.CharField(label = 'Palavras Chave',)
    keywords = forms.CharField()
    anotacaoCorrecao = forms.CharField(
        label = 'Anotação da Correção',
        widget=forms.Textarea,
        help_text='''Digite aqui o que foi realizado na correção do trabalho.<br />
        Veja o <a href="./historico/" target="blank" onclick="return popup(this);">Histórico do Trabalho</a>.''',
    )
    arquivo = forms.FileField(label='Novo Arquivo', required=False)
    
    def clean(self):
        # validação de Co-Autores
        trabalho = Trabalho.objects.get(id=self.data['id'])
        if not(trabalho.coautor_set.all()):
            raise forms.ValidationError("O registro de Co-Autores é obrigatório.")


class FormularioTransferenciaTrabalho(forms.Form):
    """
    Classe responsável pelo formulário de transferência de Trabalho
    Sendo usado pelo usuário colaborador, para transferir o trabalho para
    outro colaborador
    """
    colaborador = forms.ChoiceField(
        choices = [[x[0], x[2]+" "+x[3]] for x in User.objects.exclude(is_superuser=True).values_list()],
        help_text = 'Informe qual colaborador o trabalho deve ser enviado.'
    )
    anotacaoTransferencia = forms.CharField(
        label = 'Anotação da Transferência',
        widget=forms.Textarea,
        help_text='''Digite aqui o motivo da transferência do trabalho.<br />
        Veja o <a href="./historico/" target="blank" onclick="return popup(this);">Histórico do Trabalho</a>''',
    )



class FormularioCorrecaoTrabalho(forms.Form):
    """
    Classe responsável pelo formulário do Colaborador e do Publicador para Correcao de Trabalho
    """

    id = forms.IntegerField(widget=forms.HiddenInput)
    anotacaoCorrecao = forms.CharField(
        label = 'Anotação da Correção',
        widget=forms.Textarea,
        help_text='Veja o <a href="./historico/" target="blank" onclick="return popup(this);">Histórico do Trabalho</a>.',
    )
    arquivo = forms.FileField(label='Novo Arquivo', required=False)


class FormularioCadastroCoAutor(forms.Form):
    """
    Classe responsável pelo formulário de Alteração de Trabalho
    Sendo usado pelo usuário autor
    """

    nome = forms.CharField()
    papel = forms.CharField()
